#pragma once

#include <metalc/mlcc_int.h>

/* 这个有必要吗? 内部不需要这玩意传递信息*/
typedef struct mobj
{
    // 块大小
    union
    {
        word_t val_word;
        struct mobj *next;
    };

} mobj_t;



// static inline bool_t is_objsize(word_t size){
//     return (bool_t)(size & 0x1UL);
// }
// static inline bool_t has_mobjsize(mobj_t *obj)
// {
//     return is_objsize(obj->size);
// }

static inline word_t mobj_val(mobj_t *obj)
{
    // if (!has_mobjsize(obj)) return 0;
    return obj->val_word;
}

static inline void mobj_setval(mobj_t *obj, word_t val)
{
    obj->val_word = val; /*| (0x1UL);*/

}

static inline mobj_t *mobj_cast(void *ptr, word_t val)
{
    mobj_t *obj = (mobj_t *)ptr;
    mobj_setval(obj, val);
    return obj;
}
// static inline mobj_t *get_mobj_bound(void *ptr)
// {
//     hword_t layer_level;
//     mobj_t *cur = (mobj_t *)((word_t)ptr - sizeof(mobj_t));
//     if (!has_mobjsize(cur))
//     {
//         cur = cur->next;
//     }
//     return cur;
// }

// static inline bool_t check_flist_valid(slist_t *hd, slist_t *tl, hword_t cnt)
// {

//     slist_t *rest = hd->next;
//     hword_t hcnt = 1;
    
//     if(tl->next != NULL)abort();
    
//     while (rest)
//     {
//         rest = rest->next;
//         hcnt += 1;
//     }
//     if (hcnt != cnt)
//     {
//         fprintf(stderr, "FLIST INVALID!!! %u, %lu\n", hcnt, cnt);
//         abort();
//     }
// }